<?php
/*
 * description：
 * author：wh
 * email：
 * createTime：{2019/11/2} {23:04} 
 */

namespace libraries\PHPExcel;

/**
 * Excel导入
 *
 * 本文件为控制器文件
 * tp6不需要继承Controller,但tp5需要.
 * 具体是否继承依据框架而定.
 *
 * 仅支持Excel2007和Excel97-2003,不支持更低或其它版本
 *
 * 当前环境php7.3.*
 * Class Importexcel
 * @package app\index\controller
 */
class Importexcel
{
    function index()
    {
        //文件选择页面
        return view();
    }

    //文件选择后提交到此action
    static function import($tmp_file,$file_name)
    {
        $type = substr($file_name,strrpos($file_name,'.')+1);
        if ($type == 'xlsx') {
            $data = self::readExcel2007($tmp_file);
        } else if ($type == 'xls') {
            $data = self::readExcel972003($tmp_file);
        }
        return $data;
    }

    /**
     * description：
     * author：wh
     * action：
     * @param $file
     * @param bool $excelHaveTitles
     * true:Excel表格有标题时调用 self::excelHaveTitles();
     * 返回 ['标题'=>'数据',...]
     *
     * false:Excel表格没有标题时调用 self::excelHaveNoTitles;
     * 返回 ['A'=>'数据','B'=>'数据',...]
     * @return array
     * @throws \PHPExcel_Exception
     * @throws \PHPExcel_Reader_Exception
     */
    static function readExcel2007($file, $excelHaveTitles = false){
        require_once (config('app.ROOT_PATH_PRO'))."libraries/PHPExcel/PHPExcel/IOFactory.php";
        //创建读取器
        $objReader = \PHPExcel_IOFactory::createReader('Excel2007');
        //读入数据流
        $objPHPExcel = $objReader->load($file);
        // 判断使用哪种格式
        $sheet = $objPHPExcel->getSheet(0);
        // 取得总行数
        $highestRow = $sheet->getHighestDataRow();
        // 取得总列数
        $highestColumn = $sheet->getHighestDataColumn();
        // dump($highestRow);dump($highestColumn);die;

        if($excelHaveTitles){
            //Excel表格有标题时调用
            return self::excelHaveTitles($highestRow,$highestColumn, $objPHPExcel);
        }else{
            //Excel表格没有标题时调用
            return self::excelHaveNoTitles($highestRow, $highestColumn, $sheet);
        }
    }
    //Excel表格没有标题时调用
    static function excelHaveNoTitles($highestRow, $highestColumn, $sheet){
        $highestColumn ++;//如果是AT则自增1，为解决第二层循环无法判断<=问题(修改后)
        $data = array();
        for ($rowIndex = 1; $rowIndex <= $highestRow; $rowIndex++) {
            //循环读取每个单元格的内容。注意:行从1开始，列从A开始
            //因'A'<='AT'是无法为真
            //for ($colIndex = 'A'; $colIndex <= $highestColumn; $colIndex++) {//修改前
            //故改写为 false===($colIndex == $highestColumn)
            for ($colIndex = 'A'; false===($colIndex == $highestColumn); $colIndex++) {//修改后
                $addr = $colIndex . $rowIndex;
                $cell = $sheet->getCell($addr)->getValue();
                if ($cell instanceof \PHPExcel_RichText) { //富文本转换字符串
                    $cell = $cell->__toString();
                }
                $data[$rowIndex][$colIndex] = $cell;
            }
        }
        return $data;
    }
    //Excel表格有标题时调用
    static function excelHaveTitles($highestRow,$highestColumn, $objPHPExcel){
        $data = [];
        //返回所有列标题
        $sheet_title_arr = self::getExcelTitles($highestColumn, $objPHPExcel);
        for ($j = 2; $j <= $highestRow; $j++) {
            //读取一条数据
            $data_row_tmp_arr = [];
            $k = 'A';
            foreach ($sheet_title_arr as $sheet_index=>$title_name){
                //读取单元格数据
                $sheet_value = $objPHPExcel->getActiveSheet()->getCell("$k$j")->getValue();
                $data_row_tmp_arr[$title_name] = $sheet_value;
                if ($k == $highestColumn) {
                    //已读取到最大列
                    break;
                }
                $k++;
            }
            array_push($data, $data_row_tmp_arr);
        }
        return $data;
    }
    //获取97-2003格式表格数据
    static function readExcel972003($file){
        require_once (config('app.ROOT_PATH_PRO'))."libraries/PHPExcel/PHPExcel/IOFactory.php";
        //设置以Excel5格式(Excel97-2003工作簿)
        $reader = \PHPExcel_IOFactory::createReader('Excel5');
        $PHPExcel = $reader->load($file, 'utf-8'); // 载入excel文件
        $sheet = $PHPExcel->getSheet(0); // 读取第一个工作表
        $highestRow = $sheet->getHighestRow(); // 取得总行数
        $highestColumn = $sheet->getHighestColumn(); // 取得总列数
        //保存数据

        $data = array();
        for ($rowIndex = 1; $rowIndex <= $highestRow; $rowIndex++) {
            //循环读取每个单元格的内容。注意行从1开始，列从A开始
            for ($colIndex = 'A'; $colIndex <= $highestColumn; $colIndex++) {
                $addr = $colIndex . $rowIndex;
                $cell = $sheet->getCell($addr)->getValue();
                if ($cell instanceof \PHPExcel_RichText) { //富文本转换字符串
                    $cell = $cell->__toString();
                }
                $data[$rowIndex][$colIndex] = $cell;
            }
        }
        return $data;
    }
    //获取表格标题列
    static function getExcelTitles($highestColumn, $objPHPExcel){
        $sheet_title_arr = [];
        $j = 1;
        for ($k = 'A'; $k <= 100; $k++) {
            //读取单元格数据
            $sheet_title = $objPHPExcel->getActiveSheet()->getCell("$k$j")->getValue();
            //过滤列名称为空的列(读取到空列就停止)
            if (!isset($sheet_title) || is_null($sheet_title)) {
                break;
            }
            array_push($sheet_title_arr, $sheet_title);
            if ($k == $highestColumn) {
                //读取到最大列
                break;
            }
        }
        return $sheet_title_arr;
    }
}